#ifndef CINIT_H
#define CINIT_H

#include <QString>
#include <QDebug>

#include "cardReaderDev.h"
#include "alg.h"
#include <stdexcept>

namespace SDHuaYi_Script
{

    // 定义认证模式类型
    enum EnumAuthMod
    {
        DLAuth = 0, // 下载模式认证V6
        CosAuth = 1 // 应用模式认证

    };
    class CInit
    {
    public:
        // 读卡器
        cardReaderDev iReader;
        enumHYAlgType iAlgType;

        qint32 TestNum = 0;
        qint32 iCMDCout = 0; // 当前行数
        qint32 maxLineNm;

        CInit() {}

        // 解析bin文件
        virtual qint32 BinAnalize(QString sBinFileContent) = 0;
        // 解析ini文件
        virtual qint32 IniAnalize(QString sIniFileContent) = 0;
        // 返回下载模式
        virtual bool BackToDl() = 0;
        // 下载模式认证
        virtual bool DlAuth() = 0;
        // 安全写入
        virtual bool cosDownLoad(QString &message) = 0;
        // Flash复位
        virtual bool FlashReset() = 0;
        // 用户模式初始化
        virtual bool cosConfig(QString &sUID2, QString &sAuthCode) = 0;
        // 上电复位自检
        virtual bool ResetCheck(QString &sUID2) = 0;
        // 用户模式认证
        virtual bool cosAuth(QString &sAuthCode) = 0;

		// 返回下载模式
		virtual bool cosBackToDownload() = 0;

        // 发送指令
        qint32 SendAPDU(QString sCMD, QString sExSW = "9000", qint32 iflag = 0)
        {
            qint32 st = 0;
            try
            {
                bool bR_F = iReader.SendAPDU(sCMD);
                // qDebug() << sCMD + ":" + iReader.Response() + ":" + iReader.SS() + "\r\n";
                // sLOG += sCMD + "\r\n" + iReader.Response() + "\r\n" + iReader.SS() + "\r\n";
                if (!bR_F)
                {
                    throw std::runtime_error(QString("发送指令失败 %1").arg(sCMD).toStdString());
                }
                if (sExSW == "") // 如果赋空值，代表不判断返回结果
                {
                    return st;
                }
                if (iReader.SS() != sExSW)
                {
                    throw std::runtime_error(QString("指令的执行结果不符合预期 %1").arg(sCMD).toStdString());
                }
            }
            catch (...)
            {
                throw std::runtime_error(QString("发送指令异常 %1").arg(sCMD).toStdString());
            }

            return st;
        }
        /// 计算指令行数
        virtual qint32 CalculateCmdNM() = 0;
        /// 认证
        virtual qint32 Authertication(EnumAuthMod iMOD, qint32 iflag = 0, QString sCardType = "320A") = 0;
        /// 设置进度
        // void SetProcess(qint32 value, qint32 iflag = 0)
        // {
        //     if(iflag == 1)
        //     {
        //         return;
        //     }
        //     ScriptEventArgs cardTestEventArgs = new ScriptEventArgs
        //     {
        //         Type = EnumScriptEventType.TYPE_SCRIPT_PROCESS,
        //         Process = value + 1,//添加进度条加1的消息
        //         TestNum = this.TestNum
        //     };

        //     //触发事件
        //     ScriptEvent(this, cardTestEventArgs);
        // }
    };
}
#endif // CINIT_H
